package data_source.DAO.jdbc;

import domain.pojo.Consulta;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.DefaultException;

/**
 * Classe que implementa métodos de manipulação de dados de consultas
 * @author Owner
 */
public class ConsultaDAO extends GeralDAO{
    /**
     * Define que a tabela que será usada é a de consultas
     */
    public ConsultaDAO(){
	super("consulta");
    }

    /**
     * Verifica se existe uma consulta
     * @param idP id do paciente
     * @param idM id do médico
     * @return true se existir, caso contrário false.
     */
    public boolean existeConsulta(int idP, int idM){
	String sql = "SELECT * FROM consultas WHERE idPaciente = "+idP+" AND idMedico = "+idM+" AND finalizado = 0";
	ResultSet rs = null;
	try {
	    rs = query( sql );
	    if(rs.next()){
		return true;
	    }
	} catch (SQLException ex) {
	    Logger.getLogger(ConsultaDAO.class.getName()).log(Level.SEVERE, null, ex);
	}
	return false;
    }
    
    /**
     * Conta a quantidade de consultas finalizadas com tipo 0.
     * @return quantidade de consultas finalizadas
     */
    public int getQuantidadeNao(){
	int quantidade = 0;
	ResultSet rs = getDataFromItem("*", "finalizado", "0");
	try {
	    while(rs.next())
		quantidade++;
	} catch (SQLException ex) {
	    ex.printStackTrace();
	}
	
	return quantidade;
    }
    
    /**
     * Quantidade de consultas de um determinado médico
     * @param id id do médico
     * @return quantidade de consultas pertencentes ao médico
     */
     public int getQuantidadeConsultasMedico(int id){
	int quantidade = 0;
	ResultSet rs = getDataFrom2Item("*", "idMedico", String.valueOf(id), "finalizado", "0");
	try {
	    while(rs.next())
		quantidade++;
	} catch (SQLException ex) {
	    ex.printStackTrace();
	}
	
	return quantidade;
    }
    
    /**
     * Pega todas as informações de consultas não finalizadas
     * @param quantidade int número de consultas não finalizadas
     * @return matriz com informações sobre consultas não finalizadas
     */
    public Object[][] consultaTodosNaoFinalizados(int quantidade){
	int i;
	Object[][] data = null;
	ResultSet rs = getDataFromItem("*", "finalizado", "0");
	
	try{
	    data = new Object[quantidade][7];
	    i = 0;
	    while ( rs.next () ){
		data[i][0] = rs.getString("codigo");
		data[i][1] = rs.getInt("idPaciente");
		data[i][2] = rs.getInt("idMedico");
		data[i][3] = rs.getString("descricao");
		data[i][4] = rs.getBoolean("finalizado");
		data[i][5] = rs.getInt("idPaciente");
		data[i][6] = rs.getInt("idMedico");
		i++;
	    }
	} catch (SQLException e) {
	    e.printStackTrace();
	}
	return data;
    }

    /**
     * Consulta todas as consultas não finalizadas de um médico
     * @param quantidade número consultas não finalizadas
     * @param id id do médico
     * @return matriz com informações sobre consultas não finalizadas
     */
    public Object[][] consultaTodosNaoFinalizadosMedico(int quantidade, int id){
	int i;
	Object[][] data = null;
	ResultSet rs = getDataFrom2Item("*", "idMedico", String.valueOf(id), "finalizado", "0");
	
	try{
	    data = new Object[quantidade][7];
	    i = 0;
	    while ( rs.next () ){
		data[i][0] = rs.getString("codigo");
		data[i][1] = rs.getInt("idPaciente");
		data[i][2] = rs.getInt("idMedico");
		data[i][3] = rs.getString("descricao");
		data[i][4] = rs.getBoolean("finalizado");
		data[i][5] = rs.getInt("idPaciente");
		data[i][6] = rs.getInt("idMedico");
		i++;
	    }
	} catch (SQLException e) {
	    e.printStackTrace();
	}
	return data;
    }
    
    public List<Consulta> getConsultasFromMedico(int id){
	return consultaToLista(getDataFromItem("*","idMedico",String.valueOf(id)));
    }
    
    public List<Consulta> getConsultasFromEspecialidade(String espec){
	String sql = "SELECT * FROM consultas C JOIN medicos M ON c.idMedico = m.id WHERE especialidade = \""+espec+"\"";
	return consultaToLista(consultaToResultSet(sql));
    }
        
    /**
     * Insere uma consulta no banco de dados
     * @param consulta objeto consulta que será adicionado
     * @throws DefaultException
     */
    public void incluir(Consulta consulta) throws DefaultException{
	String sql = "INSERT INTO consultas (codigo, idPaciente, idMedico) "
		   + "VALUES " + "('"+ consulta.getCodigo()		+"', '"+
				       consulta.getPaciente().getId()	+"', '"+
				       consulta.getMedico().getId()	+"' )";
	System.out.println(sql);
	include(sql);
    }
    
    /**
     * Atualiza uma consulta no banco de daods
     * @param consulta objeto consulta que será atualizado
     * @throws DefaultException
     */
    public void atualizar(Consulta consulta) throws DefaultException{
	String sql = "UPDATE consultas SET idPaciente = '"+ consulta.getPaciente().getId() + "', "
					+ "idMedico = '"  + consulta.getMedico().getId() + "' "
				        + "WHERE codigo = " + consulta.getCodigo() + "";
	updateOne(sql);
    }
    
    /**
     * Marca no banco de dados que uma consulta foi finalizada
     * @param consulta objeto consulta que será atualizado
     * @throws DefaultException
     */
    public void finalizar(Consulta consulta) throws DefaultException{
	String sql = "UPDATE consultas SET descricao = '"+ consulta.getDescricao() + "', "
					+ "finalizado = 1 WHERE codigo = " + consulta.getCodigo() + "";
	updateOne(sql);
    }
    
    /**
     * Deleta uma consulta do banco de dados
     * @param codigo código da consulta
     * @throws DefaultException 
     */
    public void excluir( String codigo) throws DefaultException{
	delete("codigo",codigo);
    }
    
    public List<Consulta> consultaToLista(ResultSet rs){
	List<Consulta> lista = null;
	try {
	    lista = new ArrayList<Consulta>();
	    while(rs.next()){
		Consulta consulta = new Consulta();
		consulta.setCodigo(rs.getString("codigo"));
		consulta.getMedico().setId(rs.getInt("idMedico"));
		consulta.getPaciente().setId(rs.getInt("idPaciente"));
		consulta.setDescricao(null);
		consulta.setFinalizado(rs.getInt("finalizado"));
		lista.add(consulta);
	    }
	} catch (SQLException ex) {
	    Logger.getLogger(ConsultaDAO.class.getName()).log(Level.SEVERE, null, ex);
	}
	return lista;
    }
}
